import sqlalchemy
from sqlalchemy import create_engine, String, Column, Integer, BigInteger, DATETIME, text
from sqlalchemy.ext.declarative import declarative_base

print("sqlalchemy版本 : %s" % sqlalchemy.__version__)

# 创建一个orm模型基类
Base = declarative_base()


class Student(Base):  # 必须继承declarative_base得到的那个基类
    __tablename__ = "student"  # 必须要有__tablename__来指出这个类对应什么表，这个表可以暂时在库中不存在，SQLAlchemy会帮我们创建这个表
    id = Column(BigInteger, primary_key=True, autoincrement=True, comment="主键")
    no = Column(String(20), unique=True, comment="学号", nullable=False)  # Column类创建一个字段
    name = Column(String(20), nullable=False, unique=False, index=True)  # nullable就是决定是否not
    # null，unique就是决定是否unique。。这里假定没人重名，设置index可以让系统自动根据这个字段为基础建立索引
    sex = Column(String(2), nullable=True)
    age = Column(Integer, nullable=True)
    create_time = Column(DATETIME, nullable=True)
    dept_id = Column(BigInteger)

    def __repr__(self):
        return "<Student>{}:{}".format(self.Sname, self.Sno)


# 创建数据库连接
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/base_test?charset=utf8mb4",
                       encoding="utf-8",
                       echo=True,
                       max_overflow=0,  # 超过连接池大小外最多创建的连接
                       pool_size=500,  # 连接池大小
                       pool_timeout=300,  # 池中没有线程最多等待的时间，否则报错, 单位秒
                       pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收（重置）
                       )
Base.metadata.drop_all(engine)
# 调用engine 创建所有继承base类的数据表类
Base.metadata.create_all(engine)  # 这就是为什么表类一定要继承Base，因为Base会通过一些方法来通过引擎初始化数据库结构。不继承Base自然就没有办法和数据库发生联系了。
